﻿using System;
using System.Collections.Generic;
using PES.Common.DAL;
using log4net;

namespace PES.Common.BLL
{
    using Model;

    public class JogadorBLL
    {
        private static ILog s_logger;
        private static ILog Logger
        {
            get { return s_logger ?? (s_logger = LogManager.GetLogger("JogadorBLL")); }
        }

        private static JogadorDAL s_jogadorDAL;
        private static JogadorDAL JogDAL
        {
            get { return s_jogadorDAL ?? (s_jogadorDAL = new JogadorDAL()); }
        }

        private static CampeonatoDAL s_campDAL;
        private static CampeonatoDAL CampDAL
        {
            get { return s_campDAL ?? (s_campDAL = new CampeonatoDAL()); }
        }

        private static JogadorVirtualDAL s_jogVirtualDAL;
        private static JogadorVirtualDAL JogVirtualDAL
        {
            get { return s_jogVirtualDAL ?? (s_jogVirtualDAL = new JogadorVirtualDAL()); }
        }

        public static void CadastrarJogador(Campeonato _campeonato, Jogador _jogador)
        {
            try
            {
                if (_campeonato == null || _campeonato.ID <= 0)
                {
                    throw new ApplicationException("Campeonato inválido.");
                }
                if (_jogador == null || string.IsNullOrEmpty(_jogador.Nome))
                {
                    throw new ApplicationException("Jogador inválido.");
                }
                if (JogDAL.ExisteJogador(_campeonato.ID, _jogador.Nome))
                {
                    throw new ApplicationException("Jogador já cadastrado neste campeonato.");
                }

                JogDAL.CadastrarJogador(_campeonato.ID, _jogador);
                Campeonato camp = CampDAL.BuscarCampeonato(_campeonato.ID);
                int qtdeJogadores = JogDAL.BuscarJogadores(_campeonato.ID).Count;
                if (camp.EstiloCampeonato == TipoCampeonato.PONTOS_CORRIDOS_DOIS_TURNOS ||
                    camp.EstiloCampeonato == TipoCampeonato.PONTOS_CORRIDOS_DOIS_TURNOS_COM_FINAIS)
                {
                    int qtdeRodadas;
                    if (qtdeJogadores % 2 == 0)
                    {
                        qtdeRodadas = (qtdeJogadores - 1) * 2;
                    }
                    else
                    {
                        qtdeRodadas = qtdeJogadores * 2;
                    }
                    CampDAL.AtualizaQuantidadeRodadas(camp.ID, qtdeRodadas);
                }
                else if (camp.EstiloCampeonato == TipoCampeonato.PONTOS_CORRIDOS_UM_TURNO ||
                        camp.EstiloCampeonato == TipoCampeonato.PONTOS_CORRIDOS_UM_TURNO_COM_FINAIS)
                {
                    CampDAL.AtualizaQuantidadeRodadas(camp.ID, (qtdeJogadores - 1));
                }

            }
            catch (Exception ex)
            {
                Logger.Error("Ocorreu um erro ao cadastrar o jogador.", ex);
                throw;
            }
        }

        public static IList<Jogador> BuscarJogadores(Campeonato _campeonato)
        {
            try
            {
                if (_campeonato == null || _campeonato.ID <= 0)
                {
                    throw new ApplicationException("Campeonato inválido.");
                }

                return JogDAL.BuscarJogadores(_campeonato.ID);
            }
            catch (Exception ex)
            {
                Logger.Error("Ocorreu um erro ao cadastrar o jogador.", ex);
                throw;
            }
        }

        public static IList<Jogador> BuscarJogadoresDisponiveisPorRodada(Campeonato _campeonato, int _rodada)
        {
            try
            {
                if (_campeonato == null || _campeonato.ID <= 0)
                {
                    throw new ApplicationException("Campeonato inválido.");
                }

                return JogDAL.BuscarJogadoresDisponiveisPorRodada(_campeonato.ID, _rodada);
            }
            catch (Exception ex)
            {
                Logger.Error("Ocorreu um erro ao cadastrar o jogador.", ex);
                throw;
            }
        }

        public static IList<JogadorVirtual> BuscarJogadoresSuspensos(Jogador _jogador)
        {
            if (_jogador == null || _jogador.ID <= 0)
            {
                throw new ApplicationException("Jogador inválido.");
            }
            return JogVirtualDAL.BuscarJogadoresSuspensos(_jogador.ID);
        }

        public static IList<JogadorVirtual> BuscarJogadoresVirtuais(Jogador _jogador)
        {
            if (_jogador == null || _jogador.ID <= 0)
            {
                throw new ApplicationException("Jogador inválido.");
            }
            return JogVirtualDAL.BuscarJogadoresVirtuais(_jogador.ID);
        }

        public static Jogador BuscarJogador(Jogador _jogador)
        {
            if (_jogador == null || _jogador.ID <= 0)
            {
                throw new ApplicationException("Jogador inválido.");
            }
            
            return JogDAL.BuscarJogador(_jogador.ID);
        }
    }
}
